<HTML>
<HEAD>
<TITLE>
IndiceHashExtensible.cpp
</TITLE>
</HEAD>
<BODY>
<PRE>
<font color="blue">#include</font> <font color="maroon">"IndiceHashExtensible.h"</font>

IndiceHashExtensible<font color="black">:</font><font color="black">:</font>IndiceHashExtensible<font color="black">(</font>PrimaryKey <font color="black">*</font>primaryKey<font color="black">)</font> <font color="blue">throw</font><font color="black">(</font>IndexException<font color="black">)</font> <font color="black">:</font> EstrategiaIndice<font color="black">(</font>primaryKey<font color="black">)</font><font color="black">{</font>
    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">=</font><font color="blue">new</font> vector<font color="black">&#60;</font><font color="blue">unsigned</font> <font color="blue">int</font><font color="black">&#62;</font><font color="black">(</font><font color="black">)</font>;
    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font>push_back<font color="black">(</font><font color="maroon">0</font><font color="black">)</font>;
    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>bloquesLibres<font color="black">=</font><font color="blue">new</font> vector<font color="black">&#60;</font><font color="blue">unsigned</font> <font color="blue">int</font><font color="black">&#62;</font><font color="black">(</font><font color="black">)</font>;
    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Cubos<font color="black">=</font><font color="blue">new</font> vector<font color="black">&#60;</font>Cubo<font color="black">*</font><font color="black">&#62;</font><font color="black">(</font><font color="black">)</font>;
    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Cubos<font color="black">-</font><font color="black">&#62;</font>push_back<font color="black">(</font><font color="blue">new</font> Cubo<font color="black">(</font><font color="maroon">0</font>,<font color="maroon">1</font><font color="black">)</font><font color="black">)</font>;
    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Modificaciones<font color="black">=</font><font color="blue">new</font> vector<font color="black">&#60;</font>HashChange<font color="black">&#62;</font><font color="black">(</font><font color="black">)</font>;
<font color="black">}</font>

IndiceHashExtensible<font color="black">:</font><font color="black">:</font>~IndiceHashExtensible<font color="black">(</font><font color="black">)</font><font color="black">{</font>
    <font color="blue">delete</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla;
    <font color="blue">delete</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>bloquesLibres;
    <font color="blue">delete</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Cubos;
    <font color="blue">delete</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Modificaciones;
<font color="black">}</font>

<font color="blue">void</font> IndiceHashExtensible<font color="black">:</font><font color="black">:</font>Cargar<font color="black">(</font><font color="blue">char</font><font color="black">*</font> datoSerializadoACargar, <font color="blue">unsigned</font> <font color="blue">int</font> id<font color="black">)</font> <font color="blue">throw</font><font color="black">(</font>IndexException<font color="black">)</font><font color="black">{</font>
    <font color="blue">int</font> tamanioClave;
    <font color="blue">char</font><font color="black">*</font> clave <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>primaryKey<font color="black">-</font><font color="black">&#62;</font>GetKey<font color="black">(</font>datoSerializadoACargar, tamanioClave<font color="black">)</font>;
    string strClave <font color="black">(</font>clave<font color="black">)</font>;
    vector<font color="black">&#60;</font><font color="blue">unsigned</font> <font color="blue">int</font><font color="black">&#62;</font> vecBuscado <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Buscar<font color="black">(</font>strClave<font color="black">)</font>;
    <font color="green">// Si la clave no es repetida, inserto la clave</font>
    <font color="blue">if</font> <font color="black">(</font>vecBuscado.size<font color="black">(</font><font color="black">)</font><font color="black">!</font><font color="black">=</font><font color="maroon">0</font><font color="black">)</font><font color="black">{</font>
        <font color="blue">int</font> tamDato <font color="black">=</font> strlen<font color="black">(</font>datoSerializadoACargar<font color="black">)</font>;
        <font color="blue">int</font> toEntero <font color="black">=</font> atoi<font color="black">(</font>clave<font color="black">)</font>;
        toEntero <font color="black">=</font> abs<font color="black">(</font>toEntero<font color="black">)</font>;
        <font color="blue">unsigned</font> <font color="blue">long</font> <font color="blue">int</font> claveEntero <font color="black">=</font> <font color="black">(</font><font color="blue">unsigned</font> <font color="blue">long</font> <font color="blue">int</font><font color="black">)</font> <font color="black">(</font>toEntero<font color="black">)</font>;
        <font color="blue">unsigned</font> <font color="blue">int</font> posTabla <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>posicionTabla<font color="black">(</font>claveEntero<font color="black">)</font>;
        <font color="blue">unsigned</font> <font color="blue">int</font> bloqueAInsertar <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Hash<font color="black">(</font>claveEntero<font color="black">)</font>;
        vector<font color="black">&#60;</font><font color="blue">unsigned</font> <font color="blue">int</font><font color="black">&#62;</font><font color="black">*</font> espLibres <font color="black">=</font> Buffer<font color="black">:</font><font color="black">:</font>getInstance<font color="black">(</font><font color="black">)</font><font color="black">-</font><font color="black">&#62;</font>getListEspaciosLibres<font color="black">(</font><font color="black">)</font>;
        <font color="green">// Me fijo si el dato entra en ese bloque</font>
        <font color="blue">if</font> <font color="black">(</font>espLibres<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font><font color="black">[</font><font color="black">]</font><font color="black">(</font>bloqueAInsertar<font color="black">)</font><font color="black">&#62;</font><font color="black">=</font><font color="black">(</font><font color="blue">unsigned</font> <font color="blue">int</font><font color="black">)</font> tamDato<font color="black">)</font><font color="black">{</font>
            Cubo<font color="black">*</font> aux <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Cubos<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font>bloqueAInsertar<font color="black">)</font>;
            aux<font color="black">-</font><font color="black">&#62;</font>InsertarClave<font color="black">(</font>claveEntero<font color="black">)</font>;
            espLibres<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font><font color="black">[</font><font color="black">]</font><font color="black">(</font>bloqueAInsertar<font color="black">)</font><font color="black">=</font><font color="black">(</font>espLibres<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font><font color="black">[</font><font color="black">]</font><font color="black">(</font>bloqueAInsertar<font color="black">)</font><font color="black">)</font><font color="black">-</font>tamDato;
            HashChange Cambio<font color="black">(</font>claveEntero,bloqueAInsertar,bloqueAInsertar<font color="black">)</font>;
            <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Modificaciones<font color="black">-</font><font color="black">&#62;</font>push_back<font color="black">(</font>Cambio<font color="black">)</font>;
        <font color="black">}</font><font color="blue">else</font><font color="black">{</font> <font color="green">// Si el dato no entra en ese bloque, o sea se desborda el bloque </font>
            Cubo<font color="black">*</font> aux <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Cubos<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font>bloqueAInsertar<font color="black">)</font>;
            <font color="blue">unsigned</font> <font color="blue">int</font> tamTabla <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font>size<font color="black">(</font><font color="black">)</font>;
            <font color="blue">if</font> <font color="black">(</font>aux<font color="black">-</font><font color="black">&#62;</font>getTd<font color="black">(</font><font color="black">)</font><font color="black">=</font><font color="black">=</font>tamTabla<font color="black">)</font><font color="black">{</font> <font color="green">// Si el td del cubo es == al tamanio de la tabla</font>
                <font color="green">// Duplico la tabla</font>
                <font color="blue">for</font> <font color="black">(</font><font color="blue">unsigned</font> <font color="blue">int</font> i<font color="black">=</font><font color="maroon">0</font>; i<font color="black">&#60;</font>tamTabla; i<font color="black">+</font><font color="black">+</font><font color="black">)</font><font color="black">{</font>
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font>push_back<font color="black">(</font><font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font>i<font color="black">)</font><font color="black">)</font>;
                <font color="black">}</font>
                <font color="green">// Veo si hay algunos bloques libres</font>
                <font color="blue">if</font> <font color="black">(</font><font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>bloquesLibres<font color="black">-</font><font color="black">&#62;</font>size<font color="black">(</font><font color="black">)</font><font color="black">=</font><font color="black">=</font><font color="maroon">0</font><font color="black">)</font><font color="black">{</font>
                    <font color="green">// Si no hay bloques libres</font>
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font>posTabla<font color="black">)</font> <font color="black">=</font> tamTabla<font color="black">+</font><font color="maroon">1</font>;
                    <font color="green">// Multiplico el td del bloqueAInsertar por 2</font>
                    aux<font color="black">-</font><font color="black">&#62;</font>setTd<font color="black">(</font>aux<font color="black">-</font><font color="black">&#62;</font>getTd<font color="black">(</font><font color="black">)</font><font color="black">*</font><font color="maroon">2</font><font color="black">)</font>;
                    <font color="green">// Creo un nuevo bloque</font>
                    Cubo<font color="black">*</font> nuevoBloque <font color="black">=</font> <font color="blue">new</font> Cubo<font color="black">(</font>tamTabla<font color="black">+</font><font color="maroon">1</font>,aux<font color="black">-</font><font color="black">&#62;</font>getTd<font color="black">(</font><font color="black">)</font><font color="black">)</font>;
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Cubos<font color="black">-</font><font color="black">&#62;</font>push_back<font color="black">(</font>nuevoBloque<font color="black">)</font>;
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>redispersarBloque<font color="black">(</font>bloqueAInsertar<font color="black">)</font>;
                    <font color="green">// Luego de redispersar, inserto la clave</font>
                    <font color="blue">unsigned</font> <font color="blue">int</font> blqInsertar <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Hash<font color="black">(</font>claveEntero<font color="black">)</font>;
                    HashChange Cambio<font color="black">(</font>claveEntero,blqInsertar,blqInsertar<font color="black">)</font>;
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Modificaciones<font color="black">-</font><font color="black">&#62;</font>push_back<font color="black">(</font>Cambio<font color="black">)</font>;
                <font color="black">}</font><font color="blue">else</font><font color="black">{</font>
                    <font color="green">// Hay bloques libres</font>
                    <font color="blue">unsigned</font> <font color="blue">int</font> bloqueLibre <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>bloquesLibres<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font><font color="maroon">0</font><font color="black">)</font>;
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>bloquesLibres<font color="black">-</font><font color="black">&#62;</font>erase<font color="black">(</font><font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>bloquesLibres<font color="black">-</font><font color="black">&#62;</font>begin<font color="black">(</font><font color="black">)</font><font color="black">)</font>;
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font>posTabla<font color="black">)</font> <font color="black">=</font> bloqueLibre;
                    <font color="green">// Multiplico el td del bloqueAInsertar por 2</font>
                    aux<font color="black">-</font><font color="black">&#62;</font>setTd<font color="black">(</font>aux<font color="black">-</font><font color="black">&#62;</font>getTd<font color="black">(</font><font color="black">)</font><font color="black">*</font><font color="maroon">2</font><font color="black">)</font>;
                    <font color="green">// Pongo el mismo td al bloque libre</font>
                    Cubo<font color="black">*</font> bloqLibre <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Cubos<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font>bloqueLibre<font color="black">)</font>;
                    bloqLibre<font color="black">-</font><font color="black">&#62;</font>setTd<font color="black">(</font>aux<font color="black">-</font><font color="black">&#62;</font>getTd<font color="black">(</font><font color="black">)</font><font color="black">)</font>;
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>redispersarBloque<font color="black">(</font>bloqueAInsertar<font color="black">)</font>;
                    <font color="green">// Luego de redispersar, inserto la clave</font>
                    <font color="blue">unsigned</font> <font color="blue">int</font> blqInsertar <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Hash<font color="black">(</font>claveEntero<font color="black">)</font>;
                    HashChange Cambio<font color="black">(</font>claveEntero,blqInsertar,blqInsertar<font color="black">)</font>;
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Modificaciones<font color="black">-</font><font color="black">&#62;</font>push_back<font color="black">(</font>Cambio<font color="black">)</font>;
                <font color="black">}</font>
            <font color="black">}</font><font color="blue">else</font><font color="black">{</font> <font color="green">// Si el td del cubo &#60; tamanio de la tabla</font>
                <font color="green">// Multiplico el td del cubo desbordado</font>
                aux<font color="black">-</font><font color="black">&#62;</font>setTd<font color="black">(</font>aux<font color="black">-</font><font color="black">&#62;</font>getTd<font color="black">(</font><font color="black">)</font><font color="black">*</font><font color="maroon">2</font><font color="black">)</font>;
                <font color="green">// Recorro la tabla en aux-&#62;getTd() pasos hacia adelante y atras</font>
                <font color="blue">unsigned</font> <font color="blue">int</font> adelante <font color="black">=</font> posTabla <font color="black">+</font> aux<font color="black">-</font><font color="black">&#62;</font>getTd<font color="black">(</font><font color="black">)</font>;
                <font color="blue">if</font> <font color="black">(</font>adelante <font color="black">&#62;</font><font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font>size<font color="black">(</font><font color="black">)</font><font color="black">)</font><font color="black">{</font>
                    adelante <font color="black">=</font> adelante <font color="black">-</font>aux<font color="black">-</font><font color="black">&#62;</font>getTd<font color="black">(</font><font color="black">)</font>;
                <font color="black">}</font>
                <font color="blue">int</font> atrasAux <font color="black">=</font> posTabla <font color="black">-</font>aux<font color="black">-</font><font color="black">&#62;</font>getTd<font color="black">(</font><font color="black">)</font>;
                <font color="blue">if</font> <font color="black">(</font>atrasAux <font color="black">&#60;</font> <font color="maroon">0</font><font color="black">)</font><font color="black">{</font>
                    atrasAux <font color="black">=</font> atrasAux <font color="black">+</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font>size<font color="black">(</font><font color="black">)</font>;
                <font color="black">}</font>
                <font color="blue">unsigned</font> <font color="blue">int</font> atras <font color="black">=</font> <font color="black">(</font><font color="blue">unsigned</font> <font color="blue">int</font><font color="black">)</font> atrasAux;
                <font color="green">// Veo si hay algunos bloques libres</font>
                <font color="blue">if</font> <font color="black">(</font><font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>bloquesLibres<font color="black">-</font><font color="black">&#62;</font>size<font color="black">(</font><font color="black">)</font><font color="black">=</font><font color="black">=</font><font color="maroon">0</font><font color="black">)</font><font color="black">{</font>
                    <font color="green">// Creo un nuevo bloque</font>
                    Cubo<font color="black">*</font> bloqueNuevo <font color="black">=</font> <font color="blue">new</font> Cubo <font color="black">(</font>tamTabla,aux<font color="black">-</font><font color="black">&#62;</font>getTd<font color="black">(</font><font color="black">)</font><font color="black">)</font>;
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Cubos<font color="black">-</font><font color="black">&#62;</font>push_back<font color="black">(</font>bloqueNuevo<font color="black">)</font>;
                    <font color="green">// No hay bloques libres</font>
                    <font color="green">// Asigno las referencias de la tabla a un bloque nuevo</font>
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font>posTabla<font color="black">)</font> <font color="black">=</font> tamTabla<font color="black">+</font><font color="maroon">1</font>;
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font>adelante<font color="black">)</font> <font color="black">=</font> tamTabla<font color="black">+</font><font color="maroon">1</font>;
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font>atras<font color="black">)</font> <font color="black">=</font> tamTabla<font color="black">+</font><font color="maroon">1</font>;
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>redispersarBloque<font color="black">(</font>bloqueAInsertar<font color="black">)</font>;
                    <font color="green">// Luego de redispersar, inserto la clave</font>
                    <font color="blue">unsigned</font> <font color="blue">int</font> blqInsertar <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Hash<font color="black">(</font>claveEntero<font color="black">)</font>;
                    HashChange Cambio<font color="black">(</font>claveEntero,blqInsertar,blqInsertar<font color="black">)</font>;
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Modificaciones<font color="black">-</font><font color="black">&#62;</font>push_back<font color="black">(</font>Cambio<font color="black">)</font>;
                <font color="black">}</font><font color="blue">else</font><font color="black">{</font>
                    <font color="green">// Hay bloques libres</font>
                    <font color="blue">unsigned</font> <font color="blue">int</font> bloqueLibre <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>bloquesLibres<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font><font color="maroon">0</font><font color="black">)</font>;
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>bloquesLibres<font color="black">-</font><font color="black">&#62;</font>erase<font color="black">(</font><font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>bloquesLibres<font color="black">-</font><font color="black">&#62;</font>begin<font color="black">(</font><font color="black">)</font><font color="black">)</font>;
                    <font color="green">// Modifico el td del bloque libre</font>
                    Cubo<font color="black">*</font> bloqLibre <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Cubos<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font>bloqueLibre<font color="black">)</font>;
                    bloqLibre<font color="black">-</font><font color="black">&#62;</font>setTd<font color="black">(</font>aux<font color="black">-</font><font color="black">&#62;</font>getTd<font color="black">(</font><font color="black">)</font><font color="black">)</font>;
                    <font color="green">// Asigno las referencias de la tabla a un bloque libre</font>
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font>posTabla<font color="black">)</font> <font color="black">=</font> bloqueLibre;
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font>adelante<font color="black">)</font> <font color="black">=</font> bloqueLibre;
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font>atras<font color="black">)</font> <font color="black">=</font> bloqueLibre;
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>redispersarBloque<font color="black">(</font>bloqueAInsertar<font color="black">)</font>;
                    <font color="green">// Luego de redispersar, inserto la clave</font>
                    <font color="blue">unsigned</font> <font color="blue">int</font> blqInsertar <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Hash<font color="black">(</font>claveEntero<font color="black">)</font>;
                    HashChange Cambio<font color="black">(</font>claveEntero,blqInsertar,blqInsertar<font color="black">)</font>;
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Modificaciones<font color="black">-</font><font color="black">&#62;</font>push_back<font color="black">(</font>Cambio<font color="black">)</font>;
                <font color="black">}</font>
            <font color="black">}</font>
        <font color="black">}</font>
    <font color="black">}</font>
<font color="black">}</font>

<font color="blue">void</font> IndiceHashExtensible<font color="black">:</font><font color="black">:</font>Modificar<font color="black">(</font><font color="blue">char</font><font color="black">*</font> DatoSerializadoSinModificar, <font color="blue">char</font><font color="black">*</font> DatoSerializadoModificado, <font color="blue">unsigned</font> <font color="blue">int</font> idModificado<font color="black">)</font><font color="black">{</font>
    <font color="blue">int</font> tamanioClave;
    <font color="blue">char</font><font color="black">*</font> clave <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>primaryKey<font color="black">-</font><font color="black">&#62;</font>GetKey<font color="black">(</font>DatoSerializadoSinModificar, tamanioClave<font color="black">)</font>;
    <font color="blue">int</font> tamDatoSinModificar <font color="black">=</font> strlen<font color="black">(</font>DatoSerializadoSinModificar<font color="black">)</font>;
    <font color="blue">int</font> tamDatoModificado <font color="black">=</font> strlen <font color="black">(</font>DatoSerializadoModificado<font color="black">)</font>;
    <font color="blue">int</font> toEntero <font color="black">=</font> atoi<font color="black">(</font>clave<font color="black">)</font>;
    toEntero <font color="black">=</font> abs<font color="black">(</font>toEntero<font color="black">)</font>;
    <font color="blue">unsigned</font> <font color="blue">long</font> <font color="blue">int</font> claveEntero <font color="black">=</font> <font color="black">(</font><font color="blue">unsigned</font> <font color="blue">long</font> <font color="blue">int</font><font color="black">)</font> <font color="black">(</font>toEntero<font color="black">)</font>;
    <font color="blue">unsigned</font> <font color="blue">int</font> posTabla <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>posicionTabla<font color="black">(</font>claveEntero<font color="black">)</font>;
    <font color="blue">unsigned</font> <font color="blue">int</font> bloqueAInsertar <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Hash<font color="black">(</font>claveEntero<font color="black">)</font>;
    <font color="green">// Si se achica el dato</font>
    <font color="blue">if</font> <font color="black">(</font><font color="black">(</font>tamDatoModificado<font color="black">-</font>tamDatoSinModificar<font color="black">)</font><font color="black">&#60;</font><font color="black">=</font><font color="maroon">0</font><font color="black">)</font><font color="black">{</font>
        <font color="blue">unsigned</font> <font color="blue">int</font> bytesAchicados <font color="black">=</font> tamDatoSinModificar <font color="black">-</font>tamDatoModificado;
        vector<font color="black">&#60;</font><font color="blue">unsigned</font> <font color="blue">int</font><font color="black">&#62;</font><font color="black">*</font> espLibres <font color="black">=</font> Buffer<font color="black">:</font><font color="black">:</font>getInstance<font color="black">(</font><font color="black">)</font><font color="black">-</font><font color="black">&#62;</font>getListEspaciosLibres<font color="black">(</font><font color="black">)</font>;
        espLibres<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font><font color="black">[</font><font color="black">]</font><font color="black">(</font>bloqueAInsertar<font color="black">)</font> <font color="black">=</font> espLibres<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font><font color="black">[</font><font color="black">]</font><font color="black">(</font>bloqueAInsertar<font color="black">)</font> <font color="black">+</font> bytesAchicados;
        HashChange cambio<font color="black">(</font>claveEntero,bloqueAInsertar,bloqueAInsertar<font color="black">)</font>;
        <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Modificaciones<font color="black">-</font><font color="black">&#62;</font>push_back<font color="black">(</font>cambio<font color="black">)</font>;
    <font color="black">}</font><font color="blue">else</font><font color="black">{</font>
        <font color="blue">unsigned</font> <font color="blue">int</font> bytesAgrandados <font color="black">=</font> tamDatoModificado<font color="black">-</font>tamDatoSinModificar;
        vector<font color="black">&#60;</font><font color="blue">unsigned</font> <font color="blue">int</font><font color="black">&#62;</font><font color="black">*</font> espLibres <font color="black">=</font> Buffer<font color="black">:</font><font color="black">:</font>getInstance<font color="black">(</font><font color="black">)</font><font color="black">-</font><font color="black">&#62;</font>getListEspaciosLibres<font color="black">(</font><font color="black">)</font>;
        <font color="green">// Me fijo si el datoModificado entra en ese bloque</font>
        <font color="blue">if</font> <font color="black">(</font>espLibres<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font><font color="black">[</font><font color="black">]</font><font color="black">(</font>bloqueAInsertar<font color="black">)</font><font color="black">&#62;</font><font color="black">=</font><font color="black">(</font><font color="blue">unsigned</font> <font color="blue">int</font><font color="black">)</font> bytesAgrandados<font color="black">)</font><font color="black">{</font>
            espLibres<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font><font color="black">[</font><font color="black">]</font><font color="black">(</font>bloqueAInsertar<font color="black">)</font><font color="black">=</font><font color="black">(</font>espLibres<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font><font color="black">[</font><font color="black">]</font><font color="black">(</font>bloqueAInsertar<font color="black">)</font><font color="black">)</font><font color="black">-</font>bytesAgrandados;
            HashChange Cambio<font color="black">(</font>claveEntero,bloqueAInsertar,bloqueAInsertar<font color="black">)</font>;
            <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Modificaciones<font color="black">-</font><font color="black">&#62;</font>push_back<font color="black">(</font>Cambio<font color="black">)</font>;
        <font color="black">}</font><font color="blue">else</font><font color="black">{</font> <font color="green">// No entra al bloque</font>
            Cubo<font color="black">*</font> aux <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Cubos<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font>bloqueAInsertar<font color="black">)</font>;
            <font color="blue">unsigned</font> <font color="blue">int</font> tamTabla <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font>size<font color="black">(</font><font color="black">)</font>;
            <font color="blue">if</font> <font color="black">(</font>aux<font color="black">-</font><font color="black">&#62;</font>getTd<font color="black">(</font><font color="black">)</font><font color="black">=</font><font color="black">=</font>tamTabla<font color="black">)</font><font color="black">{</font> <font color="green">// Si el td del cubo es == al tamanio de la tabla</font>
                <font color="green">// Duplico la tabla</font>
                <font color="blue">for</font> <font color="black">(</font><font color="blue">unsigned</font> <font color="blue">int</font> i<font color="black">=</font><font color="maroon">0</font>; i<font color="black">&#60;</font>tamTabla; i<font color="black">+</font><font color="black">+</font><font color="black">)</font><font color="black">{</font>
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font>push_back<font color="black">(</font><font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font>i<font color="black">)</font><font color="black">)</font>;
                <font color="black">}</font>
                <font color="green">// Veo si hay algunos bloques libres</font>
                <font color="blue">if</font> <font color="black">(</font><font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>bloquesLibres<font color="black">-</font><font color="black">&#62;</font>size<font color="black">(</font><font color="black">)</font><font color="black">=</font><font color="black">=</font><font color="maroon">0</font><font color="black">)</font><font color="black">{</font>
                    <font color="green">// Si no hay bloques libres</font>
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font>posTabla<font color="black">)</font> <font color="black">=</font> tamTabla<font color="black">+</font><font color="maroon">1</font>;
                    <font color="green">// Multiplico el td del bloqueAInsertar por 2</font>
                    aux<font color="black">-</font><font color="black">&#62;</font>setTd<font color="black">(</font>aux<font color="black">-</font><font color="black">&#62;</font>getTd<font color="black">(</font><font color="black">)</font><font color="black">*</font><font color="maroon">2</font><font color="black">)</font>;
                    <font color="green">// Creo un nuevo bloque</font>
                    Cubo<font color="black">*</font> nuevoBloque <font color="black">=</font> <font color="blue">new</font> Cubo<font color="black">(</font>tamTabla<font color="black">+</font><font color="maroon">1</font>,aux<font color="black">-</font><font color="black">&#62;</font>getTd<font color="black">(</font><font color="black">)</font><font color="black">)</font>;
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Cubos<font color="black">-</font><font color="black">&#62;</font>push_back<font color="black">(</font>nuevoBloque<font color="black">)</font>;
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>redispersarBloque<font color="black">(</font>bloqueAInsertar<font color="black">)</font>;
                    <font color="green">// Luego de redispersar, inserto la clave</font>
                    <font color="blue">unsigned</font> <font color="blue">int</font> blqInsertar <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Hash<font color="black">(</font>claveEntero<font color="black">)</font>;
                    HashChange Cambio<font color="black">(</font>claveEntero,blqInsertar,blqInsertar<font color="black">)</font>;
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Modificaciones<font color="black">-</font><font color="black">&#62;</font>push_back<font color="black">(</font>Cambio<font color="black">)</font>;
                <font color="black">}</font><font color="blue">else</font><font color="black">{</font>
                    <font color="green">// Hay bloques libres</font>
                    <font color="blue">unsigned</font> <font color="blue">int</font> bloqueLibre <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>bloquesLibres<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font><font color="maroon">0</font><font color="black">)</font>;
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>bloquesLibres<font color="black">-</font><font color="black">&#62;</font>erase<font color="black">(</font><font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>bloquesLibres<font color="black">-</font><font color="black">&#62;</font>begin<font color="black">(</font><font color="black">)</font><font color="black">)</font>;
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font>posTabla<font color="black">)</font> <font color="black">=</font> bloqueLibre;
                    <font color="green">// Multiplico el td del bloqueAInsertar por 2</font>
                    aux<font color="black">-</font><font color="black">&#62;</font>setTd<font color="black">(</font>aux<font color="black">-</font><font color="black">&#62;</font>getTd<font color="black">(</font><font color="black">)</font><font color="black">*</font><font color="maroon">2</font><font color="black">)</font>;
                    <font color="green">// Pongo el mismo td al bloque libre</font>
                    Cubo<font color="black">*</font> bloqLibre <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Cubos<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font>bloqueLibre<font color="black">)</font>;
                    bloqLibre<font color="black">-</font><font color="black">&#62;</font>setTd<font color="black">(</font>aux<font color="black">-</font><font color="black">&#62;</font>getTd<font color="black">(</font><font color="black">)</font><font color="black">)</font>;
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>redispersarBloque<font color="black">(</font>bloqueAInsertar<font color="black">)</font>;
                    <font color="green">// Luego de redispersar, inserto la clave</font>
                    <font color="blue">unsigned</font> <font color="blue">int</font> blqInsertar <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Hash<font color="black">(</font>claveEntero<font color="black">)</font>;
                    HashChange Cambio<font color="black">(</font>claveEntero,blqInsertar,blqInsertar<font color="black">)</font>;
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Modificaciones<font color="black">-</font><font color="black">&#62;</font>push_back<font color="black">(</font>Cambio<font color="black">)</font>;
                <font color="black">}</font>
            <font color="black">}</font><font color="blue">else</font><font color="black">{</font> <font color="green">// Si el td del cubo &#60; tamanio de la tabla</font>
                <font color="green">// Multiplico el td del cubo desbordado</font>
                aux<font color="black">-</font><font color="black">&#62;</font>setTd<font color="black">(</font>aux<font color="black">-</font><font color="black">&#62;</font>getTd<font color="black">(</font><font color="black">)</font><font color="black">*</font><font color="maroon">2</font><font color="black">)</font>;
                <font color="green">// Recorro la tabla en aux-&#62;getTd() pasos hacia adelante y atras</font>
                <font color="blue">unsigned</font> <font color="blue">int</font> adelante <font color="black">=</font> posTabla <font color="black">+</font> aux<font color="black">-</font><font color="black">&#62;</font>getTd<font color="black">(</font><font color="black">)</font>;
                <font color="blue">if</font> <font color="black">(</font>adelante <font color="black">&#62;</font><font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font>size<font color="black">(</font><font color="black">)</font><font color="black">)</font><font color="black">{</font>
                    adelante <font color="black">=</font> adelante <font color="black">-</font>aux<font color="black">-</font><font color="black">&#62;</font>getTd<font color="black">(</font><font color="black">)</font>;
                <font color="black">}</font>
                <font color="blue">int</font> atrasAux <font color="black">=</font> posTabla <font color="black">-</font>aux<font color="black">-</font><font color="black">&#62;</font>getTd<font color="black">(</font><font color="black">)</font>;
                <font color="blue">if</font> <font color="black">(</font>atrasAux <font color="black">&#60;</font> <font color="maroon">0</font><font color="black">)</font><font color="black">{</font>
                    atrasAux <font color="black">=</font> atrasAux <font color="black">+</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font>size<font color="black">(</font><font color="black">)</font>;
                <font color="black">}</font>
                <font color="blue">unsigned</font> <font color="blue">int</font> atras <font color="black">=</font> <font color="black">(</font><font color="blue">unsigned</font> <font color="blue">int</font><font color="black">)</font> atrasAux;
                <font color="green">// Veo si hay algunos bloques libres</font>
                <font color="blue">if</font> <font color="black">(</font><font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>bloquesLibres<font color="black">-</font><font color="black">&#62;</font>size<font color="black">(</font><font color="black">)</font><font color="black">=</font><font color="black">=</font><font color="maroon">0</font><font color="black">)</font><font color="black">{</font>
                    <font color="green">// Creo un nuevo bloque</font>
                    Cubo<font color="black">*</font> bloqueNuevo <font color="black">=</font> <font color="blue">new</font> Cubo <font color="black">(</font>tamTabla,aux<font color="black">-</font><font color="black">&#62;</font>getTd<font color="black">(</font><font color="black">)</font><font color="black">)</font>;
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Cubos<font color="black">-</font><font color="black">&#62;</font>push_back<font color="black">(</font>bloqueNuevo<font color="black">)</font>;
                    <font color="green">// No hay bloques libres</font>
                    <font color="green">// Asigno las referencias de la tabla a un bloque nuevo</font>
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font>posTabla<font color="black">)</font> <font color="black">=</font> tamTabla<font color="black">+</font><font color="maroon">1</font>;
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font>adelante<font color="black">)</font> <font color="black">=</font> tamTabla<font color="black">+</font><font color="maroon">1</font>;
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font>atras<font color="black">)</font> <font color="black">=</font> tamTabla<font color="black">+</font><font color="maroon">1</font>;
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>redispersarBloque<font color="black">(</font>bloqueAInsertar<font color="black">)</font>;
                    <font color="green">// Luego de redispersar, inserto la clave</font>
                    <font color="blue">unsigned</font> <font color="blue">int</font> blqInsertar <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Hash<font color="black">(</font>claveEntero<font color="black">)</font>;
                    HashChange Cambio<font color="black">(</font>claveEntero,blqInsertar,blqInsertar<font color="black">)</font>;
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Modificaciones<font color="black">-</font><font color="black">&#62;</font>push_back<font color="black">(</font>Cambio<font color="black">)</font>;
                <font color="black">}</font><font color="blue">else</font><font color="black">{</font>
                    <font color="green">// Hay bloques libres</font>
                    <font color="blue">unsigned</font> <font color="blue">int</font> bloqueLibre <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>bloquesLibres<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font><font color="maroon">0</font><font color="black">)</font>;
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>bloquesLibres<font color="black">-</font><font color="black">&#62;</font>erase<font color="black">(</font><font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>bloquesLibres<font color="black">-</font><font color="black">&#62;</font>begin<font color="black">(</font><font color="black">)</font><font color="black">)</font>;
                    <font color="green">// Modifico el td del bloque libre</font>
                    Cubo<font color="black">*</font> bloqLibre <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Cubos<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font>bloqueLibre<font color="black">)</font>;
                    bloqLibre<font color="black">-</font><font color="black">&#62;</font>setTd<font color="black">(</font>aux<font color="black">-</font><font color="black">&#62;</font>getTd<font color="black">(</font><font color="black">)</font><font color="black">)</font>;
                    <font color="green">// Asigno las referencias de la tabla a un bloque libre</font>
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font>posTabla<font color="black">)</font> <font color="black">=</font> bloqueLibre;
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font>adelante<font color="black">)</font> <font color="black">=</font> bloqueLibre;
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font>atras<font color="black">)</font> <font color="black">=</font> bloqueLibre;
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>redispersarBloque<font color="black">(</font>bloqueAInsertar<font color="black">)</font>;
                    <font color="green">// Luego de redispersar, inserto la clave</font>
                    <font color="blue">unsigned</font> <font color="blue">int</font> blqInsertar <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Hash<font color="black">(</font>claveEntero<font color="black">)</font>;
                    HashChange Cambio<font color="black">(</font>claveEntero,blqInsertar,blqInsertar<font color="black">)</font>;
                    <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Modificaciones<font color="black">-</font><font color="black">&#62;</font>push_back<font color="black">(</font>Cambio<font color="black">)</font>;
                <font color="black">}</font>
            <font color="black">}</font>
        <font color="black">}</font>
    <font color="black">}</font>
<font color="black">}</font>

vector<font color="black">&#60;</font><font color="blue">unsigned</font> <font color="blue">int</font><font color="black">&#62;</font> IndiceHashExtensible<font color="black">:</font><font color="black">:</font>Buscar<font color="black">(</font>std<font color="black">:</font><font color="black">:</font>string claveABuscar<font color="black">)</font><font color="black">{</font>
    vector<font color="black">&#60;</font><font color="blue">unsigned</font> <font color="blue">int</font><font color="black">&#62;</font> resultado;
    <font color="blue">char</font><font color="black">*</font> clave <font color="black">=</font> <font color="blue">new</font> <font color="blue">char</font> <font color="black">[</font>claveABuscar.size<font color="black">(</font><font color="black">)</font><font color="black">+</font><font color="maroon">1</font><font color="black">]</font>;
    strcpy <font color="black">(</font>clave, claveABuscar.c_str<font color="black">(</font><font color="black">)</font><font color="black">)</font>;
    <font color="blue">int</font> toEntero <font color="black">=</font> atoi<font color="black">(</font>clave<font color="black">)</font>;
    toEntero <font color="black">=</font> abs<font color="black">(</font>toEntero<font color="black">)</font>;
    <font color="blue">unsigned</font> <font color="blue">long</font> <font color="blue">int</font> claveEntero <font color="black">=</font> <font color="black">(</font><font color="blue">unsigned</font> <font color="blue">long</font> <font color="blue">int</font><font color="black">)</font> <font color="black">(</font>toEntero<font color="black">)</font>;
    <font color="blue">unsigned</font> <font color="blue">int</font> bloqueClave <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Hash<font color="black">(</font>claveEntero<font color="black">)</font>;
    Cubo<font color="black">*</font> aux <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Cubos<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font>bloqueClave<font color="black">)</font>;
    vector<font color="black">&#60;</font><font color="blue">unsigned</font> <font color="blue">long</font> <font color="blue">int</font><font color="black">&#62;</font><font color="black">*</font> vecClaves <font color="black">=</font> aux<font color="black">-</font><font color="black">&#62;</font>getClaves<font color="black">(</font><font color="black">)</font>;
    <font color="blue">for</font> <font color="black">(</font><font color="blue">unsigned</font> <font color="blue">int</font> i<font color="black">=</font><font color="maroon">0</font>; i<font color="black">&#60;</font>vecClaves<font color="black">-</font><font color="black">&#62;</font>size<font color="black">(</font><font color="black">)</font>; i<font color="black">+</font><font color="black">+</font><font color="black">)</font><font color="black">{</font>
        <font color="blue">if</font> <font color="black">(</font>vecClaves<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font><font color="black">[</font><font color="black">]</font><font color="black">(</font>i<font color="black">)</font><font color="black">=</font><font color="black">=</font>claveEntero<font color="black">)</font><font color="black">{</font>
            resultado.push_back<font color="black">(</font>bloqueClave<font color="black">)</font>;
        <font color="black">}</font>
    <font color="black">}</font>
    <font color="blue">return</font> resultado;
<font color="black">}</font>

<font color="blue">void</font> IndiceHashExtensible<font color="black">:</font><font color="black">:</font>Eliminar<font color="black">(</font><font color="blue">char</font><font color="black">*</font> DatoSerializadoAEliminar<font color="black">)</font><font color="black">{</font>
    <font color="blue">int</font> tamanioClave;
    <font color="blue">char</font><font color="black">*</font> clave <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>primaryKey<font color="black">-</font><font color="black">&#62;</font>GetKey<font color="black">(</font>DatoSerializadoAEliminar, tamanioClave<font color="black">)</font>;
    string claveABuscar<font color="black">(</font>clave<font color="black">)</font>;
    vector<font color="black">&#60;</font><font color="blue">unsigned</font> <font color="blue">int</font><font color="black">&#62;</font> vecBuscado <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Buscar<font color="black">(</font>claveABuscar<font color="black">)</font>;
    <font color="green">// Busco el dato, si encuentro en algun bloque lo elimino</font>
    <font color="blue">if</font> <font color="black">(</font>vecBuscado.size<font color="black">(</font><font color="black">)</font><font color="black">!</font><font color="black">=</font><font color="maroon">0</font><font color="black">)</font><font color="black">{</font> <font color="green">// Encontrado</font>
        <font color="blue">int</font> toEntero <font color="black">=</font> atoi<font color="black">(</font>clave<font color="black">)</font>;
        toEntero <font color="black">=</font> abs<font color="black">(</font>toEntero<font color="black">)</font>;
        <font color="blue">unsigned</font> <font color="blue">long</font> <font color="blue">int</font> claveEntero <font color="black">=</font> <font color="black">(</font><font color="blue">unsigned</font> <font color="blue">long</font> <font color="blue">int</font><font color="black">)</font> <font color="black">(</font>toEntero<font color="black">)</font>;
        <font color="blue">unsigned</font> <font color="blue">int</font> posTabla <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>posicionTabla<font color="black">(</font>claveEntero<font color="black">)</font>;
        <font color="blue">unsigned</font> <font color="blue">int</font> bloqueDato <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Hash<font color="black">(</font>claveEntero<font color="black">)</font>;
        <font color="green">// Notifico al cambio</font>
        HashChange eliminado<font color="black">(</font>claveEntero,bloqueDato,bloqueDato<font color="black">)</font>;
        <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Modificaciones<font color="black">-</font><font color="black">&#62;</font>push_back<font color="black">(</font>eliminado<font color="black">)</font>;
        <font color="green">// Me fijo si el bloque quedo vacio</font>
        Cubo<font color="black">*</font> aux <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Cubos<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font>bloqueDato<font color="black">)</font>;
        aux<font color="black">-</font><font color="black">&#62;</font>EliminarClave<font color="black">(</font>claveEntero<font color="black">)</font>;
        <font color="blue">if</font> <font color="black">(</font>aux<font color="black">-</font><font color="black">&#62;</font>estaVacio<font color="black">(</font><font color="black">)</font><font color="black">)</font><font color="black">{</font>
            <font color="green">// Recorro circularmente la tabla con saltos de (td del bloqueVacio/2)</font>
            <font color="blue">unsigned</font> <font color="blue">int</font> saltos <font color="black">=</font> aux<font color="black">-</font><font color="black">&#62;</font>getTd<font color="black">(</font><font color="black">)</font>;
            saltos <font color="black">=</font> saltos <font color="black">/</font> <font color="maroon">2</font>;
            <font color="blue">unsigned</font> <font color="blue">int</font> adelante <font color="black">=</font> posTabla <font color="black">+</font> saltos;
            <font color="blue">if</font> <font color="black">(</font>adelante<font color="black">&#62;</font><font color="black">=</font><font color="black">(</font><font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font>size<font color="black">(</font><font color="black">)</font><font color="black">)</font><font color="black">)</font><font color="black">{</font>
                adelante <font color="black">=</font> adelante <font color="black">-</font><font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font>size<font color="black">(</font><font color="black">)</font>;
            <font color="black">}</font>
            <font color="blue">int</font> atrasAux <font color="black">=</font> posTabla <font color="black">-</font>saltos;
            <font color="blue">if</font> <font color="black">(</font>atrasAux <font color="black">&#60;</font> <font color="maroon">0</font><font color="black">)</font><font color="black">{</font>
                atrasAux <font color="black">=</font> atrasAux <font color="black">+</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font>size<font color="black">(</font><font color="black">)</font>;
            <font color="black">}</font>
            <font color="blue">unsigned</font> <font color="blue">int</font> atras <font color="black">=</font> <font color="black">(</font><font color="blue">unsigned</font> <font color="blue">int</font><font color="black">)</font> atrasAux;
            <font color="green">// Veo si las referencias de la tabla son iguales</font>
            <font color="blue">unsigned</font> <font color="blue">int</font> bloqueAdelante <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font>adelante<font color="black">)</font>;
            <font color="blue">unsigned</font> <font color="blue">int</font> bloqueAtras <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font>atras<font color="black">)</font>;
            <font color="green">// Si son iguales entonces puedo liberar al bloque vacio</font>
            <font color="blue">if</font> <font color="black">(</font>bloqueAdelante <font color="black">=</font><font color="black">=</font> bloqueAtras<font color="black">)</font><font color="black">{</font>
                <font color="green">// Asigno la referencia de la tabla del bloque vacio con el bloqueAdelante</font>
                <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font>posTabla<font color="black">)</font> <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font>bloqueAdelante<font color="black">)</font>;
                <font color="green">// Agrego el numero del bloque vacio al vector de bloques libres</font>
                <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>bloquesLibres<font color="black">-</font><font color="black">&#62;</font>push_back<font color="black">(</font>bloqueDato<font color="black">)</font>;
                <font color="green">// Veo si se puede compactar la tabla</font>
                <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>compactarTabla<font color="black">(</font><font color="black">)</font>;
            <font color="black">}</font>
        <font color="black">}</font>
    <font color="black">}</font>
<font color="black">}</font>

<font color="blue">void</font> IndiceHashExtensible<font color="black">:</font><font color="black">:</font>compactarTabla<font color="black">(</font><font color="black">)</font><font color="black">{</font>
    <font color="blue">bool</font> estaDuplicada <font color="black">=</font> <font color="blue">true</font>;
    <font color="blue">unsigned</font> <font color="blue">int</font> mitad <font color="black">=</font> <font color="black">(</font><font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font>size<font color="black">(</font><font color="black">)</font><font color="black">/</font><font color="maroon">2</font><font color="black">)</font>;
    <font color="blue">for</font> <font color="black">(</font><font color="blue">unsigned</font> <font color="blue">int</font> i<font color="black">=</font><font color="maroon">0</font>; i<font color="black">&#60;</font>mitad; i<font color="black">+</font><font color="black">+</font><font color="black">)</font><font color="black">{</font>
        <font color="blue">if</font> <font color="black">(</font><font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font>i<font color="black">)</font><font color="black">!</font><font color="black">=</font><font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font>i<font color="black">+</font>mitad<font color="black">)</font><font color="black">)</font><font color="black">{</font>
            estaDuplicada <font color="black">=</font> <font color="blue">false</font>;
        <font color="black">}</font>
    <font color="black">}</font>
    <font color="blue">if</font> <font color="black">(</font>estaDuplicada<font color="black">)</font><font color="black">{</font>
        <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font>erase<font color="black">(</font><font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font>begin<font color="black">(</font><font color="black">)</font><font color="black">+</font>mitad, <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font>end<font color="black">(</font><font color="black">)</font><font color="black">)</font>;
    <font color="black">}</font>
<font color="black">}</font>

<font color="blue">void</font> IndiceHashExtensible<font color="black">:</font><font color="black">:</font>redispersarBloque<font color="black">(</font><font color="blue">unsigned</font> <font color="blue">int</font> bloque<font color="black">)</font><font color="black">{</font>
    Cubo<font color="black">*</font> cubo <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Cubos<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font>bloque<font color="black">)</font>;
    vector<font color="black">&#60;</font><font color="blue">unsigned</font> <font color="blue">long</font> <font color="blue">int</font><font color="black">&#62;</font><font color="black">*</font> claves <font color="black">=</font> cubo<font color="black">-</font><font color="black">&#62;</font>getClaves<font color="black">(</font><font color="black">)</font>;
    <font color="blue">for</font> <font color="black">(</font><font color="blue">unsigned</font> <font color="blue">int</font> i<font color="black">=</font><font color="maroon">0</font>; i<font color="black">&#60;</font><font color="black">(</font>cubo<font color="black">-</font><font color="black">&#62;</font>getClaves<font color="black">(</font><font color="black">)</font><font color="black">-</font><font color="black">&#62;</font>size<font color="black">(</font><font color="black">)</font><font color="black">)</font>; i<font color="black">+</font><font color="black">+</font><font color="black">)</font><font color="black">{</font>
        <font color="green">//Aca empiezo a redispersar las claves del bloque</font>
        <font color="blue">unsigned</font> <font color="blue">long</font> <font color="blue">int</font> aux <font color="black">=</font> claves<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font><font color="black">[</font><font color="black">]</font><font color="black">(</font>i<font color="black">)</font>;
        <font color="blue">unsigned</font> <font color="blue">int</font> bloqueNuevo <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Hash<font color="black">(</font>aux<font color="black">)</font>;
        <font color="blue">if</font> <font color="black">(</font>bloqueNuevo<font color="black">!</font><font color="black">=</font>bloque<font color="black">)</font><font color="black">{</font> <font color="green">// Se redisperso en otro bloque</font>
            HashChange cambio<font color="black">(</font>aux,bloque,bloqueNuevo<font color="black">)</font>;
            <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Modificaciones<font color="black">-</font><font color="black">&#62;</font>push_back<font color="black">(</font>cambio<font color="black">)</font>;
            cubo<font color="black">-</font><font color="black">&#62;</font>EliminarClave<font color="black">(</font>aux<font color="black">)</font>;
            Cubo<font color="black">*</font> cuboDestino <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Cubos<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font>bloqueNuevo<font color="black">)</font>;
            cuboDestino<font color="black">-</font><font color="black">&#62;</font>InsertarClave<font color="black">(</font>aux<font color="black">)</font>;
        <font color="black">}</font>
    <font color="black">}</font>
<font color="black">}</font>

<font color="blue">unsigned</font> <font color="blue">int</font> IndiceHashExtensible<font color="black">:</font><font color="black">:</font>posicionTabla<font color="black">(</font><font color="blue">unsigned</font> <font color="blue">long</font> <font color="blue">int</font> clave<font color="black">)</font><font color="black">{</font>
    <font color="blue">unsigned</font> <font color="blue">int</font> pos;
    pos <font color="black">=</font> clave % <font color="black">(</font><font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font>size<font color="black">(</font><font color="black">)</font><font color="black">)</font>;
    <font color="blue">return</font> pos;
<font color="black">}</font>

<font color="blue">unsigned</font> <font color="blue">int</font> IndiceHashExtensible<font color="black">:</font><font color="black">:</font>Hash<font color="black">(</font><font color="blue">unsigned</font> <font color="blue">long</font> <font color="blue">int</font> clave<font color="black">)</font><font color="black">{</font>
    <font color="blue">unsigned</font> <font color="blue">int</font> pos;
    <font color="blue">unsigned</font> <font color="blue">int</font> resultado;
    pos <font color="black">=</font> clave % <font color="black">(</font><font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font>size<font color="black">(</font><font color="black">)</font><font color="black">)</font>;
    resultado <font color="black">=</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>tabla<font color="black">-</font><font color="black">&#62;</font><font color="blue">operator</font> <font color="black">[</font><font color="black">]</font><font color="black">(</font>pos<font color="black">)</font>;
    <font color="blue">return</font> resultado;
<font color="black">}</font>

vector<font color="black">&#60;</font>HashChange<font color="black">&#62;</font><font color="black">*</font> IndiceHashExtensible<font color="black">:</font><font color="black">:</font>getModificaciones<font color="black">(</font><font color="black">)</font><font color="black">{</font>
    <font color="blue">return</font> <font color="blue">this</font><font color="black">-</font><font color="black">&#62;</font>Modificaciones;
<font color="black">}</font>

</PRE>
</BODY>
</HTML>
